/**
 * Enlève les espaces en début et fin de chaîne
 * 
 * Fonction reprise de http://www.webtoolkit.info
 * 
 * @param {String} chars les caractères à supprimer (si non renseigné, tous les espaces)
 * @return {String} la chaîne sans ces caractères
 */
String.prototype.trim = function (chars) {
    return this.ltrim(chars).rtrim(chars);
};

/**
 * Enlève les espaces en début de chaîne
 * 
 * Fonction reprise de http://www.webtoolkit.info
 * 
 * @param {String} chars les caractères à supprimer (si non renseigné, tous les espaces)
 * @return {String} la chaîne sans ces caractères
 */
String.prototype.ltrim = function(chars) {
	chars = chars || "\\s";
	return this.replace(new RegExp("^[" + chars + "]+", "g"), "");
};

/**
 * Enlève les espaces en fin de chaîne
 * 
 * Fonction reprise de http://www.webtoolkit.info
 * 
 * @param {String} chars les caractères à supprimer (si non renseigné, tous les espaces)
 * @return {String} la chaîne sans ces caractères
 */
String.prototype.rtrim = function(chars) {
	chars = chars || "\\s";
	return this.replace(new RegExp("[" + chars + "]+$", "g"), "");
};

/**
 * Permet de formatter une chaîne avec des paramètres
 * 
 * Les paramètres s'écrivent sous la forme: $1, $2, $3...
 * Il n'y a aucune limite sur le nombre.
 * 
 * Si un paramètre n'est pas trouvé, il est remplacé par une chaîne vide
 * 
 * Exemple:
 * String.format("toto est $1", ["blabla"])
 * => "toto est blabla"
 * 
 * @param {String} str La chaîne paramétrée 
 * @param {Array} args les valeurs des paramètres
 * 
 * @return {String} la chaîne avec les paramètres remplacé
 */
String.format = function(str, args, alpha)
{
	if (typeof(alpha) == "undefined")
		alpha = false;
	newstr = str;
	// RegExp des paramètres: un $ puis des nombres
  var regexp;
	if (!alpha)
		regexp = /#([0-9]+)/;
	else
		regexp = /#([0-9a-z_]+)/i;
	var matches;
	
	// Tant qu'on trouve des paramètres
	while ((matches = regexp.exec(newstr)))
	{
		// Index du paramètres
		var index;
		var index_tab;
		if (!alpha)
		{
			index = parseInt(matches[1]);
			index_tab = index-1;
		}
		else
		{
			index = index_tab = matches[1];
		}
		
		// RegExp de remplacement
		var reg_to_replace = new RegExp("#"+index+"([^0-9]{0,1})")
		var replacement = ""
		
		// Si la valeur existe, on l'insère
		if (isset(args[index_tab]))
			replacement = args[index_tab];
		
		replacement += "$1";
		
		newstr = newstr.replace(reg_to_replace,replacement);
	}
	return newstr;
};

/**
 * Permet de formatter la chaîne courante avec des paramètres
 * 
 * Plus de détail dans String.format
 * 
 * Exemple:
 * str.format(["blabla"])
 * => "toto est blabla"
 * 
 * @param {Array} args les valeurs des paramètres
 * 
 * @return {String} la chaîne avec les paramètres remplacé
 */
String.prototype.format = function(args)
{
	var str = this;
	return String.format(str,args);
};

/**
 * Permet de savoir si une chaîne commence par une sous-chaîne
 *
 * @param {String} str la sous-chaine
 * @return {Boolean} true si la chaîne commence par la sous chaîne, false sinon
 */
String.prototype.beginsWith = function(str)
{
	var ret = false;
	if (this.length >= str.length && this.substr(0,str.length) == str)
		ret = true;
		
	return ret;
};

/**
 * Remplace les variables dans la chaîne courante
 *
 * @param {Array} vars les variables
 * @return {String} la chaîne avec les variables remplacés
 */
String.prototype.replaceVars = function(vars)
{
	var str = this;
	return String.format(str,vars,true);
}
